package com.gotrade.demo;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.concurrent.EventExecutorGroup;

import java.nio.charset.Charset;
import java.util.Date;

/**
 * @author jason.tang
 * @create 2018-12-04 16:00
 * @description
 *  总结：
 *      1. 服务端的逻辑处理器依然继承ChannelInboundHandlerAdapter
 *      2. 重写channelRead方法，此方法在接收到客户端数据之后回调
 *      3. msg就是Netty里面数据读写的载体（为什么不直接是ByteBuf？）
 */
public class FirstServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * channelRead方法再接收到客户端发来的数据之后被回调
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        System.out.println(new Date() + ": 服务端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8")));

        /** 服务端回复数据给客户端，与客户端同理 **/
        ByteBuf buffer = getByteBuf(ctx);
        ctx.channel().writeAndFlush(buffer);
    }

    private ByteBuf getByteBuf(ChannelHandlerContext ctx) {
        // 1. 获取二进制抽象ByteBuf（先获得内存管理器）
        ByteBuf buffer = ctx.alloc().buffer();

        // 2. 准备数据，指定字符串的字符集为utf-8
        byte[] bytes = "hello, netty client".getBytes(Charset.forName("utf-8"));

        // 3. 将二进制数据填充到ByteBuf
        buffer.writeBytes(bytes);

        return buffer;
    }
}